package com.zyl.file.service;

import com.zyl.file.dto.FilePartInfoDTO;
import com.zyl.file.dto.SplitUploadDTO;
import com.zyl.file.dto.StFileDTO;
import com.zyl.file.platform.FileStorage;
import com.zyl.file.po.StFile;
import com.zyl.file.vo.SplitUploadVO;
import com.zyl.file.vo.UploadSplitVO;
import org.springframework.web.multipart.MultipartFile;

/**
 * 分片上传
 *
 * @author zyl
 * @Description
 * @since  2023/7/20 10:03
 */
public interface SplitUploadTaskService {

    /** -------------------------------------------------- 前端分片上传 --------------------------------------------------*/

    /**
     * 根据md5标识获取分片上传任务
     * @param identifier 文件md5
     * @return Result
     */
    StFile getByIdentifier (String identifier, Long id);

    /**
     * 初始化一个任务
     * @param param 分片参数
     * @param id id
     * @return Result
     */
    SplitUploadDTO initTask(SplitUploadVO param, Long id);

    /**
     * 获取上传进度
     * @param identifier 文件md5
     * @param isEncrypt 是否加密
     * @param equipmentId 存储设备id
     * @param id id
     * @return SplitUploadDTO
     */
    SplitUploadDTO getTaskInfo(String identifier, Integer isEncrypt,Long equipmentId,Long id);

    /**
     * 获取上传信息（上传进度、预签名上传url、文件信息）
     * @param splitUploadVO 上传所需传值
     * @return Result
     */
    SplitUploadDTO getUploadInfo(SplitUploadVO splitUploadVO);

    /**
     * 生成预签名上传url
     * @param identifier 文件md5
     * @param partNumber 分片位置
     * @param type 区分移动端和pc端，移动端传值为0，pc端不传
     * @param isOpen 是否是open
     * @param id id
     * @param equipmentId 存储设备id
     * @return Result
     */
    String genPreSignUploadUrl(String identifier, Integer partNumber, String type, Boolean isOpen, Long id,Long equipmentId);

    /**
     * 合并分片
     * @param identifier 文件md5
     * @param isFlat 是否偏离矫正
     * @param id id
     * @param equipmentId 存储设备id
     * @return Result
     */
    StFile merge(String identifier, Boolean isFlat, Long id, Long equipmentId);


    /** -------------------------------------------------- 后端分片上传 --------------------------------------------------*/

    /**
     * S3后端分片上传
     * @param fileByte 文件
     * @param userId 用户id
     * @param stEquipmentId 设备id
     * @param fileName 文件名
     * @param fileSource 文件来源(服务名：使用spring:application:name)
     * @param md5 文件md5
     * @param isEncrypt 是否加密
     * @return Result
     */
    StFileDTO useS3Upload(byte[] fileByte, Long userId, Long stEquipmentId, String fileName, String fileSource, String md5,Integer isEncrypt);

    /**
     * S3后端分片上传
     * @param multipartFile 文件
     * @param userId 用户id
     * @param stEquipmentId 设备id
     * @param fileName 文件名
     * @param fileSource 文件来源(服务名：使用spring:application:name)
     * @param md5 文件md5
     * @param isEncrypt 是否加密 加密：1 不加密：其他数字或空
     * @return Result
     */
    StFileDTO useS3Upload(MultipartFile multipartFile, Long userId, Long stEquipmentId, String fileName, String fileSource, String md5,Integer isEncrypt);

    /**
     * 取消上传
     * @param md5 文件md5
     * @param stEquipmentId 存储id
     */
    void cancelFileUpload(String md5 ,String stEquipmentId);

    /**
     * 加密文件
     * @param task 文件对象
     * @param fileStorage 文件存储对象
     * @return Result
     */
    StFile fileEncrypt(StFile task, FileStorage fileStorage);

    /**
     * 分片文件上传
     * @param uploadSplitVO 分片参数
     * @return Result
     */
    FilePartInfoDTO uploadSplit(UploadSplitVO uploadSplitVO);
}
